﻿#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;

class Person {
public:
	// 完成虚函数的重写
	virtual void BuyTicket() { cout << "买票-全价" << endl; }
};
class Student : public Person {
public:
	// 派生类的虚函数可以不写virtual(但不规范)
	virtual void BuyTicket() { cout << "买票-打折" << endl; }
};
//多态的实现
// 必须是基类的指针或引用
void Func(Person* ptr)// 父类子类对象赋值兼容转换(切片)
{
	// 这里可以看到虽然都是Person指针Ptr在调用BuyTicket
	// 但是跟ptr没关系，⽽是由ptr指向的对象决定的。
	ptr->BuyTicket();
}
int main()
{
	Person ps;
	Student st;
	Func(&ps);// 满足多态时传谁调谁，不满足时调的都是基类
	Func(&st);// 传派生类会切片，把派生类中基类的部分切出来
	return 0;
}


class Animal
{
public:
	virtual void talk() const
	{}
};
class Dog : public Animal
{
public:
	virtual void talk() const
	{
		std::cout << "汪汪" << std::endl;
	}
};
class Cat : public Animal
{
public:
	virtual void talk() const
	{
		std::cout << "(>^ω^<)喵" << std::endl;
	}
};
// 虚函数实现在多个子类之间
void letsHear(const Animal& animal)
{
	animal.talk();
}
int main()
{
	Cat cat;
	Dog dog;
	letsHear(cat);
	letsHear(dog);
	return 0;
}
